package com.superkripts.sktools.value;

import ch.njol.skript.lang.Expression;
import com.superkripts.sktools.annotation.Param;
import org.jetbrains.annotations.NotNull;

import java.lang.reflect.Parameter;
import java.util.HashMap;
import java.util.Map;

/**
 * 自定义默认值
 *
 * @see Param
 * @see BaseDefaultValue
 */
public abstract class CustomDefaultValue {

    private static final Map<Class<? extends CustomDefaultValue>, CustomDefaultValue> defaultValueRegistry = new HashMap<>();

    /**
     * 返回默认值
     *
     * @param parameter 参数
     * @param value     值
     * @return 默认值
     */
    @NotNull
    abstract public Expression<?> getDefaultValue(@NotNull Parameter parameter, @NotNull String value);

    /**
     * 获取自定义默认值的实例
     * 避免构造重复实例
     *
     * @param clazz 类
     * @return 自定义默认值实例
     */
    public static CustomDefaultValue getCustomDefaultValueInstance(Class<? extends CustomDefaultValue> clazz) {
        return defaultValueRegistry.computeIfAbsent(clazz, c -> {
            try {
                return c.getConstructor().newInstance();
            } catch (ReflectiveOperationException e) {
                throw new IllegalStateException(e);
            }
        });
    }
}
